package com.spzx.product.api;

import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.common.core.web.page.TableDataInfo;
import com.spzx.product.api.domain.*;
import com.spzx.product.api.domain.vo.SkuLockVo;
import com.spzx.product.api.domain.vo.SkuStockVo;
import com.spzx.product.api.factory.RemoteProductFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author Haoran Sun
 * @since 2024/07/23
 */
@FeignClient(
        contextId = "RemoteProductService",
        value = ServiceNameConstants.PRODUCT_SERVICE,
        fallbackFactory = RemoteProductFallbackFactory.class)
public interface RemoteProductService {
    /**
     * 获取销量前20的商品sku
     *
     * @param source 源-判断是否为内部调用
     * @return 商品sku列表
     */
    @GetMapping("/product/getTopSale")
    R<List<ProductSku>> getTopSale(@RequestHeader(name = SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取sku列表
     *
     * @param pageNum  分页参数起始页
     * @param pageSize 分页参数每页数量
     * @param skuQuery 查询条件
     * @param source   源-判断是否为内部调用
     * @return sku列表
     */
    @GetMapping("/product/skuList/{pageNum}/{pageSize}")
    R<TableDataInfo> skuList(
            @PathVariable("pageNum") Integer pageNum,
            @PathVariable("pageSize") Integer pageSize,
            @SpringQueryMap SkuQuery skuQuery,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据skuId获取sku
     * @param skuId skuId
     * @param source 源-判断是否为内部调用
     * @return sku
     */
    @GetMapping("/product/getProductSku/{skuId}")
    R<ProductSku> getProductSku(@PathVariable("skuId") Long skuId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据id获取商品
     * @param id 商品id
     * @param source 源-判断是否为内部调用
     * @return 商品
     */
    @GetMapping(value = "/product/getProduct/{id}")
    R<Product> getProduct(@PathVariable("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取sku价格
     * @param skuId skuId
     * @param source  源-判断是否为内部调用
     * @return sku价格
     */
    @GetMapping(value = "/product/getSkuPrice/{skuId}")
    R<SkuPrice> getSkuPrice(@PathVariable("skuId") Long skuId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取商品详情
     * @param id 商品id
     * @param source 源-判断是否为内部调用
     * @return  商品详情
     */
    @GetMapping(value = "/product/getProductDetails/{id}")
    R<ProductDetails> getProductDetails(@PathVariable("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

     /**
     * 获取sku规格对应商品skuId信息
     * @param id 商品id
     * @param source 源-判断是否为内部调用
     * @return sku规格对应商品skuId信息
     */
    @GetMapping(value = "/product/getSkuSpecValue/{id}")
    R<Map<String, Long>> getSkuSpecValue(@PathVariable("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取sku库存
     *
     * @param skuId  skuId
     * @param source 源-判断是否为内部调用
     * @return sku库存
     */
    @GetMapping(value = "/product/getSkuStock/{skuId}")
    R<SkuStockVo> getSkuStock(@PathVariable("skuId") Long skuId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取sku价格列表
     *
     * @param skuIdList skuId列表
     * @param source    源-判断是否为内部调用
     * @return sku价格列表
     */
    @PostMapping(value = "/product/getSkuPriceList")
    R<List<SkuPrice>> getSkuPriceList(@RequestBody List<Long> skuIdList, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    @PostMapping("/skuStock/checkAndLock/{orderNo}")
    R<String> checkAndLock(@PathVariable("orderNo") String orderNo, @RequestBody List<SkuLockVo> skuLockVoList,
                                  @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

}
